#include <geo\mercatorProjection.h>

mercatorProjection::mercatorProjection() {

};

mercatorProjection::~mercatorProjection() {

};

vec2i
mercatorProjection::getTile(geoLocation location, int level) {

  double latitude = location[0];  // latitude
  double longitude = location[1]; // longitude

  int ilongitude = (int) floor(((longitude + 180.0) / 360.0) * pow(2.0, level));

  while (latitude > 90.0) latitude -= 90.0;
  while (latitude < -90.0) latitude += 90.0;

  int ilatitude = (int) floor(((1.0 - log(tan(latitude * PI / 180.0) + 1.0 / cos(latitude * PI / 180.0)) / PI) / 2.0) * pow(2.0, level)); 

  return vec2i(ilongitude, ilatitude);
};

vec2d
mercatorProjection::getTiled(geoLocation location, int level) {

  double latitude = location[0];  // latitude
  double longitude = location[1]; // longitude

  double dlongitude = ((longitude + 180.0) / 360.0) * pow(2.0, level);

  while (latitude > 90.0) latitude -= 90.0;
  while (latitude < -90.0) latitude += 90.0;

  double dlatitude = ((1.0 - log(tan(latitude * PI / 180.0) + 1.0 / cos(latitude * PI / 180.0)) / PI) / 2.0) * pow(2.0, level); 

  return vec2d(dlongitude, dlatitude);
};
